import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.Currency;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.xml.bind.annotation.XmlElementDecl.GLOBAL;

public class FreeHand {

	public final DrawPad drawPad;

	public FreeHand() {

		JFrame frame = new JFrame();
		drawPad = new DrawPad();
		frame.add(drawPad, BorderLayout.CENTER);
		JButton clearButton = new JButton("Clear");
		clearButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				drawPad.clear();
			}
		});
		frame.add(clearButton, BorderLayout.SOUTH);
		frame.setSize(Global.max_x, Global.max_y);

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	public int getTargetNote() {
		
		try
		{
		if(Global.state.equalsIgnoreCase("arohan"))
		{
			return Global.raga.arohan.get((Global.div_arohan.ceiling(drawPad.currentX))/Global.widthup);
		}
		else if(Global.state.equalsIgnoreCase("avrohan"))
		{
			return Global.raga.avrohan.get((Global.div_avrohan.ceiling(drawPad.currentX))/Global.widthup);
		}
		}
		catch (Exception e) {
			System.out.println("ERROR IN getTargetNote. returning default value");
			return 5;
		
		}
		return -1;
	}

	public int getTargetDuration() {
		int temp = Math.abs(10 + (drawPad.currentY));
		if(temp<20) temp =20;
		System.out.println("returnin: " + temp);
		return temp;
	}

}

class DrawPad extends JComponent {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	Image image;
	Graphics2D graphics2D;
	int currentX, currentY, oldX, oldY;

	public DrawPad() {
		setDoubleBuffered(false);
		addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				oldX = e.getX();
				oldY = e.getY();
			}
		});
		addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent e) {
				currentX = e.getX();
				currentY = e.getY();
				if (graphics2D != null) {
					graphics2D.setStroke(new BasicStroke(10,
							BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
					graphics2D.setColor(Color.RED);
					graphics2D.drawLine(oldX, oldY, currentX, currentY);
					
/////////////////////////////SETTING OF STATE//////////////////////////
					if(oldX<=currentX)
						Global.state="arohan";
					else 
						Global.state="avrohan";
//////////////////////////////////////////////////////////////////////

				}
				repaint();
				oldX = currentX;
				oldY = currentY;
			}
		});
	}

	public void paintComponent(Graphics g) {
		if (image == null) {
			image = createImage(getSize().width, getSize().height);
			graphics2D = (Graphics2D) image.getGraphics();
			graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
			clear();
		}
		g.drawImage(image, 0, 0, null);
	}

	public void clear() {
		graphics2D.setPaint(Color.white);
		graphics2D.fillRect(0, 0, getSize().width, getSize().height);
		graphics2D.setPaint(Color.black);
		repaint();
	}
}
